%{
#include <stdio.h>
%}
%token IDENTIF C_ENTERA T_ENTERO STRING SALTO_LINEA OP_ASIGNACION OP_TIPO OP_DELIMITADOR OP_ARIT_SUMAR PUNTO ABRE_PARENTESIS CIERRA_PARENTESIS COMA OP_RELACIONAL
%%
paquete                 : declaracion_paquete cuerpo_paquete
												;

declaracion_paquete     : 'package' IDENTIF 'is'
                              declaracion
                              declaracion_subprograma
                           'end' IDENTIF
                        ;

cuerpo_paquete          : 'package' 'body' IDENTIF 'is'
                             declaracion_subprograma
                           'begin'
                              expresion
                           'end' IDENTIF
                        ;

constante               : C_ENTERA 
						| STRING
						;
												
operadores              : OP_ARIT_SUMAR 
              			| OP_RELACIONAL
              			| 'and'
												;
												
declaracion             : IDENTIF OP_TIPO declaracion
						| IDENTIF ',' declaracion
						| tipo
						| tipo OP_ASIGNACION tipo
                        ;

tipo                    : boolean
                    	| T_ENTERO
                    	;
                 
boolean					: 'true'
						| 'false'
						;

tipo_array              : 'type' IDENTIF '=' 'array' ABRE_PARENTESIS T_ENTERO PUNTO PUNTO T_ENTERO CIERRA_PARENTESIS 'of' tipo
												;

bloque_sentencias       : sentencia bloque_sentencias
						| sentencia
						;

sentencia               : sentencia_asignacion
               			| sentencia_llamada
						| sentencia_condicional
						;
												
sentencia_asignacion    : IDENTIF OP_ASIGNACION expresion
						;
						
sentencia_condicional   : 'if' expresion 'then'
                              expresion
                           'else'
                              expresion
                           'end if'
						| 'if' expresion 'then'
                              expresion
                           'end if'
                        ;

sentencia_llamada       : IDENTIF ABRE_PARENTESIS argumentos CIERRA_PARENTESIS
						| IDENTIF
						;

argumentos              : IDENTIF
						| ',' argumentos
						;

retorno_procedimiento   : 'return'
						;

declaracion_subprograma : 'procedure' IDENTIF 'is'
                            declaracion
                            declaracion_subprograma
                           'end' IDENTIF;
                        ;


expresion      			: expresion OP_ASIGNACION expresion
               			| expresion 'and' expresion
              			| 'true'
              			| 'false'
              			| constante
               			| IDENTIF
						;
